NodeJS 整合 SQLite
整合到 NodeJS
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(':memory:');
db.serialize(function() {
db.run("CREATE TABLE lorem (info TEXT)");
var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
for (var i = 0; i < 10; i++) {
stmt.run("Ipsum " + i);
}
stmt.finalize();
db.each("SELECT rowid AS id, info FROM lorem", function(err, row) {
console.log(row.id + ": " + row.info);
});
});
db.close();
配置环境
npm install sqlite3 -S
这个过程出现两个的库 node-pre-gyp
和 node-gyp
这是在下载源码并编译,需要要挂上小飞机,否则会卡在编译这里(编译的确实有点慢)
node-pre-gyp install --fallback-to-build
node-gyp
:是一个跨平台的命令行工具,用于编译 C++ 编写的 nodejs 扩展,首先 gyp 是为 Chromium 项目创建的项目生成工具,可以从平台无关的配置生成平台相关的 Visual Studio、Xcode、Makefile 的项目文件,node-gyp
就是将其集成到 nodejs 中。
因为 linux 的二进制分发快平台做的并不好,所有 npm 为了方便干脆就直接源码分发,用户装的时候再现场编译。不过对有些项目二进制分发就比源码分发简单多了,所以还有个 node-pre-gyp
来直接二进制扩展的分发。
两者区别在于 node-gyp 是发布扩展的源码,然后安装时候编译;node-pre-gyp
是直接发布编译后的二级制形式的扩展。
新建并打开数据库
new sqlite3.Database(filename, [mode], [callback])
filename:有效值是一个文件名,如:mydatebase.db
,数据库打开之后会创建一个 mydatebase.db
的文件用于保存数据。如果文件名是 :memory:
,表示是一个内存数据库(类似h2那种),数据不会持久化保存,当关闭数据库时,内容将丢失。
mode(可选):数据库的模式,共3种值:sqlite3.OPEN_READONLY
(只读),sqlite3.OPEN_READWRITE
(可读写)和 sqlite3.OPEN_CREATE
(可以创建)。 默认值为 OPEN_READWRITE |OPEN_CREATE
callback(可选):则当数据库成功打开或发生错误时,将调用此函数。 第一个参数是一个错误对象,当它为空时,表示打开成功。
var database;
// 创建一个数据库的名字是 "datebase.db" 如果有的话则不会创建
database = new sqlite3.Database("datebase.db");
// 也可以使用内存型,数据不会永久保存
database = new sqlite3.Database(":memory:");
// 关闭数据库连接
database.close();
查询数据
const sqlite3 = require("sqlite3").verbose()
// sqlite 数据库地址
let sqliteDbPath = "./studysqlite.db"
// 打开 sqlite 数据库
let db = new sqlite3.Database(sqliteDbPath)
// all 查询所有数据
db.all(`select * from tb_user`, function(err, row) {
if (err) throw err
else {
console.log('all查询结果', row) // 返回的是一个数组
// console.log(JSON.stringify(row));
}
})
// each 逐条查询数据
db.each("select * from tb_user", function(err, row) {
if (err) throw err
else {
console.log('each查询结果:', row)
}
})
// 按条件查询
db.each("select * from tb_user where user_name = ?", '张三', function(err, row) {
if (err) throw err
else {
console.log('each筛选结果:', row)
}
})
直接操作 SQL
// Directly in the function arguments.
db.run("UPDATE tbl SET name = ? WHERE id = ?", "bar", 2);
// As an array.
db.run("UPDATE tbl SET name = ? WHERE id = ?", [ "bar", 2 ]);
// As an object with named parameters.
db.run("UPDATE tbl SET name = $name WHERE id = $id", {
$id: 2,
$name: "bar"
});
db.run("UPDATE tbl SET name = ?5 WHERE id = ?", {
1: 2,
5: "bar"
});
Database#run(sql, [param, ...], [callback])
注意这个回调会在语句的准备和执行中发生错误的时候被掉用
新增数据
// 增加一条数据
var sql_add = db.prepare(`insert into tb_user (user_name, birthday) values('buding', 123456)`)
sql_add.run()
console.log(sql_add)
删除一条数据
// 删除数据
var sql_del = db.prepare(`delete from tb_user where user_name='buding'`)
sql_del.run()
数据修改
// 修改一条数据
var sql_modify = db.prepare(`update tb_user set user_name='buding' where user_id=1`)
sql_modify.run()
关闭数据库
注意:用完数据库要记得释放 Database#close([callback])
// 关闭数据库连接
database.close();
Reference
参考资料 官方库 Node-SQLite 参考资料 官方文档